package club.beimeng.msmservice.email;


import club.beimeng.msmservice.email.entity.Accounts;
import club.beimeng.msmservice.email.template.entity.SendCode;
import com.sun.mail.util.MailSSLSocketFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.security.GeneralSecurityException;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

@Component
public class EmailSender {
    /*
     * 3 我们可以通过application.properties来配置多个账号
     * 4 我们需要有邮件模板，使用new一个邮件对象的方式,也就是写一个实体类
     * 1 发送邮件的账号需要自动轮询，有最低时间间隔,避免封号
     * 2 发送的是否可能遇到无法发送的情况，轮换账号进行自动发送
     *
     * sender 中有多种方法，对应多种的场景,每种方法对应不同的模板,
     * service 不用在意我们是怎么发送的，用哪个账号发送的，只需要配置对应的模板
    * */
    private String usEmail;
    private String usEmailPassword ;

    private int countIndex = 0;

    @Autowired
    private Accounts accounts;

    private void chooseCount(){
        List<Accounts.Account> accountList = this.accounts.getAccounts();
        usEmail = accountList.get(countIndex).getEmailNumber();
        usEmailPassword = accountList.get(countIndex).getEmailPassword();
        int size = accountList.size();
        countIndex++;
        if (countIndex >= size){
            countIndex %= size;
        }
    }

    private Boolean sendEmail(SendCode sendCode,String toEmail) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com");  //设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
        prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码

        // 关于QQ邮箱，还要设置SSL加密，加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        //使用JavaMail发送邮件的5个步骤

        //创建定义整个应用程序所需的环境信息的 Session 对象

        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名、授权码
                return new PasswordAuthentication(usEmail, usEmailPassword);
            }
        });


        //开启Session的debug模式，这样就可以查看到程序发送Email的运行状态
//        session.setDebug(true);

        //2、通过session得到transport对象
        Transport ts = session.getTransport();

        //3、使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com", usEmail, usEmailPassword);

        //4、创建邮件

        //创建邮件对象
        MimeMessage message = new MimeMessage(session);

        //指明邮件的发件人
        message.setFrom(new InternetAddress(usEmail,sendCode.getFrom(),"UTF-8"));

        //指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));

        //邮件的标题
        message.setSubject(sendCode.getTitle());

        //邮件的文本内容
        message.setContent(sendCode.getContent(), "text/html;charset=UTF-8");

        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());

        ts.close();
        return true;
    }

    // 设置一个方法,配置对应的邮件模板,并且配置对应的实体类
    public Boolean sendCode(SendCode sendCode, String toEmail) throws Exception {
        // 选择账号
        chooseCount();
        //发送邮件
        return sendEmail(sendCode,toEmail);
    }
}




/*
 *
 * @author Mr.Bao
 * @date 2021/8/2 18:47
 */